#!/usr/bin/env python
# -*- coding: utf-8; indent-tabs-mode:nil; tab-width:4 -*-

# This file is part of DITA DTD Generator.
#
# DITA DTD Generator is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# DITA DTD Generator is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with DITA DTD Generator.  If not, see <http://www.gnu.org/licenses/>.

import sys
import httplib
import cgi
import cgitb; cgitb.enable()
import urlparse
import urllib
#import xml.dom.minidom
#import sys
import os
import re
import time
#import stat
import datetime
#import dita
#from HTMLParser import HTMLParser
#from htmldom import DOMHTMLParser
import tempfile
import tarfile
import ditagen.xml
import ditagen.dita.v1_2
import ditagen.generator

DOMAIN_MAP = {
    "ui": ditagen.dita.v1_2.UiDomain,
    "hi": ditagen.dita.v1_2.HiDomain,
    "pr": ditagen.dita.v1_2.PrDomain,
    "sw": ditagen.dita.v1_2.SwDomain,
    "ut": ditagen.dita.v1_2.UtDomain,
    "indexing": ditagen.dita.v1_2.IndexingDomain,
    "learning": ditagen.dita.v1_2.LearningDomain,
    "learningmeta": ditagen.dita.v1_2.LearningMetaDomain,
    "learningmap": ditagen.dita.v1_2.LearningMapDomain,
    "mitask": ditagen.dita.v1_2.MachineIndustryTaskDomain,
    "hazardstatement": ditagen.dita.v1_2.HazardStatementDomain,
    "mapgroup": ditagen.dita.v1_2.MapGroupDomain,
    "abbreviated": ditagen.dita.v1_2.AbbreviatedFormDomain,
    "xnal": ditagen.dita.v1_2.XNALDomain,
    "delay": ditagen.dita.v1_2.UserDelayedResolutionDomain,
    "classify": ditagen.dita.v1_2.ClassifyDomain,
    "taskbody": ditagen.dita.v1_2.MachineIndustryTaskbodyConstraints,
    "strictTaskbody": ditagen.dita.v1_2.StrictTaskbodyConstraints
    }
TOPIC_MAP = {
    "concept": ditagen.dita.v1_2.ConceptType,
    "reference": ditagen.dita.v1_2.ReferenceType,
    "task": ditagen.dita.v1_2.TaskType,
    "topic": ditagen.dita.v1_2.TopicType,
    "machineTask": ditagen.dita.v1_2.MachineryTaskType,
    "map": ditagen.dita.v1_2.MapType,
    "bookmap": ditagen.dita.v1_2.BookMapType,
    "classifyMap": ditagen.dita.v1_2.ClassificationMapType,
    "subjectScheme": ditagen.dita.v1_2.SubjectSchemeMapType,
    "learningAssessment": ditagen.dita.v1_2.LearningAssessmentType,
    "learningBookmap": ditagen.dita.v1_2.LearningBookMapType,
    "learningContent": ditagen.dita.v1_2.LearningContentType,
    "learningMap": ditagen.dita.v1_2.LearningMapType,
    "learningOverview": ditagen.dita.v1_2.LearningOverviewType,
    "learningPlan": ditagen.dita.v1_2.LearningPlanType,
    "learningSummary": ditagen.dita.v1_2.LearningSummaryType
    }

def print_response_headers(__file_name):
    print u"Status: 200 Ok"
    print u"Content-Type: text/plain; charset=UTF-8"
    # print u"Content-disposition: attachment; file_name=%s.%s" % (__root, __f)
    #print u"Content-disposition: file_name=%s" % __file_name #__dita.getfileName(__type, __root, __f)
    print

def main(form):
    #form = cgi.FieldStorage()
    # get domains
    __domains = []
    for __d in form.getlist(u"domain"):
        if __d in DOMAIN_MAP:
            __domains.append(DOMAIN_MAP[__d]())
    # get type
    __t = form.getfirst(u"type")
    if __t in TOPIC_MAP:
        __type = TOPIC_MAP[__t]()
    # get arguments
    __root = form.getfirst(u"root")
    __owner = form.getfirst(u"owner")
    __nested = u"nested" in form
    __remove = dict([(n, True) for n in form.getlist("remove")])
    #if __root is None or re.match("^\s*$", __root):
    #    __root = __type.get_root().get_name()
#    if __root == __type.get_root().get_name():
#        __root = None
    #if __root == None or __root == "":
    #    __root = __type.get_root().get_name()
    __global_atts = None#form.getfirst(u"attribute")
    __f = form.getfirst(u"file")
    # run generator
    dita_gen = ditagen.generator.DitaGenerator()
    dita_gen.set_output(sys.stdout)
    dita_gen.set_topic_type(__type)
    dita_gen.set_domains(__domains)
    dita_gen.set_root(__root)
    dita_gen.set_owner(__owner)
    dita_gen.set_nested(__nested)
    
    if __f == u"dtd":
        __file_name = dita_gen.get_file_name(__type, __root, __f)
        print_response_headers(__file_name)
        #dita_gen.print_dtd(__type, __domains, __root, __owner, __nested, __remove, __global_atts)
        dita_gen.generate_dtd()
        #dita_gen.print_dtd_file(__type, __domains, __owner, __nested)
    elif __f == u"mod":
        __file_name = dita_gen.get_file_name(__type, __root, __f)
        print_response_headers(__file_name)
        dita_gen.print_mod(__type, __domains, __root, __owner, __nested, __remove, __global_atts)
    elif __f == u"tgz":
        __file_name = dita_gen.get_file_name(__type, __root, "tar.gz")
        #print_response_headers(__file_name)
        print u"Status: 200 Ok"
        print u"Content-Encoding: x-gzip"
        print u"Content-type: application/x-tar"
        print u"Content-disposition: attachment; filename=%s" % __file_name #getFileName(__type, __root, "tar.gz")
        print
        dita_gen.generate_zip(sys.stdout, __type, __domains, __root, __owner, __nested, __remove, __global_atts)
    elif __f == u"xzip":
        __file_name = dita_gen.get_file_name(__type, __root, "zip")
        #print_response_headers(__file_name)
        print u"Status: 200 Ok"
        #print u"Content-Encoding: x-gzip"
        print u"Content-type: application/zip"
        print u"Content-disposition: attachment; filename=%s" % __file_name #getFileName(__type, __root, "tar.gz")
        print
        zip_dita_gen = ditagen.generator.ZipGenerator(sys.stdout)
        zip_dita_gen.generate_zip(sys.stdout, __type, __domains, __root, __owner, __nested)
    elif __f == u"zip":
        __file_name = dita_gen.get_file_name(__type, __root, "zip")
        #print_response_headers(__file_name)
        print u"Status: 200 Ok"
        #print u"Content-Encoding: x-gzip"
        print u"Content-type: application/zip"
        print u"Content-disposition: attachment; filename=%s" % __file_name #getFileName(__type, __root, "tar.gz")
        print
        #zip_dita_gen = ditagen.generator.DitaGenerator(sys.stdout)
        #dita_gen = ditagen.generator.DitaGenerator()
        #zip_dita_gen.generate_zip(sys.stdout, __type, __domains, __root, __owner, __nested)
        #dita_gen.set_topic_type(__type)
        #dita_gen.set_domains(__domains)
        #dita_gen.set_root(__root)
        #dita_gen.set_owner(__owner)
        #dita_gen.set_nested(__nested)
        dita_gen.generate_zip(sys.stdout)

if __name__ == "__main__":
    main()
